package com.own.business.pay.core.service;

import com.own.business.pay.common.em.PayEnum;
import com.own.business.pay.core.model.PayOrderModel;
import com.own.business.pay.core.model.RefundOrderModel;
import com.own.business.pay.entity.bo.BillHistoryBo;
import com.own.business.pay.entity.map.BillHistoryMapVo;
import com.own.business.pay.entity.po.BillHistory;
import com.own.business.pay.entity.query.BillHistoryQuery;
import com.own.business.pay.entity.vo.BillHistoryVo;
import com.own.component.common.base.service.BaseService;

import java.util.Collection;
import java.util.List;

/**
 * BillHistoryService
 *
 * @author chenxueli
 * @date 2023-08-22 08:53:48
 */
public interface BillHistoryService extends BaseService<
        BillHistory,
        BillHistoryBo,
        BillHistoryVo,
        BillHistoryMapVo,
        BillHistoryQuery
        > {

    /**
     * 初始化数据（支出）
     *
     * @param type       支付类型
     * @param outTradeNo 商户订单号
     * @param model      请求数据
     */
    void initExpenditure(PayEnum.Method type, String outTradeNo, PayOrderModel model);

    /**
     * 初始化数据（收入）
     *
     * @param type       支付类型
     * @param outTradeNo 商户订单号
     * @param model      请求数据
     */
    void initIncome(PayEnum.Method type, String outTradeNo, PayOrderModel model);

    /**
     * 初始化数据（退款）
     *
     * @param type       支付类型
     * @param outTradeNo 商户订单号
     * @param model      请求数据
     */
    void initRefund(PayEnum.Method type, String outTradeNo, RefundOrderModel model);

    /**
     * 通知（成功支付）
     *
     * @param type       支付类型
     * @param outTradeNo 商户订单号
     * @param notifyData 通知数据
     */
    void notifySuccess(PayEnum.Method type, String outTradeNo, String notifyData);

    /**
     * 通知（退款通知成功）
     *
     * @param type        支付类型
     * @param outRefundNo 退款订单号
     * @param notifyData  通知数据
     */
    void notifyRefundSuccess(PayEnum.Method type, String outRefundNo, String notifyData);

    /**
     * 根据订单号查询信息（支付信息）
     *
     * @param tradeNo 订单号
     * @return 订单信息
     */
    BillHistory getByTradeNo(String tradeNo);

    /**
     * 根据订单号查询信息（收入信息）
     *
     * @param tradeNo 订单号
     * @return 订单信息
     */
    BillHistory getByTradeNoForIncome(String tradeNo);

    /**
     * 获取订单列表
     *
     * @param tradeNo 订单号
     * @return 订单信息
     */
    List<BillHistory> listByTradeNo(String tradeNo);

    /**
     * 获取订单列表
     *
     * @param tradeNoList 订单号列表
     * @return 订单信息
     */
    List<BillHistory> listByTradeNoList(Collection<String> tradeNoList);

    /**
     * 根据退款单号查询信息
     *
     * @param refundNo 退款单号
     * @return 订单信息
     */
    BillHistory getByRefundNo(String refundNo);

    /**
     * 检查退款情况
     *
     * @param outTradeNo 商户订单号
     */
    void checkRefund(String outTradeNo);

    /**
     * 关闭订单
     *
     * @param outTradeNo 商户订单号
     */
    void close(String outTradeNo);

}

